home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / parser < prev    next >
Encoding:
Text File  |  1994-02-08  |  19.2 KB  |  1,130 lines

  1.  
  2.         /* C Declarations */
  3.  
  4. %{
  5.  
  6. #include "iccomp.h"
  7.  
  8. %}
  9.  
  10.         /* Bison Declarations */
  11.  
  12. %token
  13.         ARG_HEAD
  14.         ARG_TAIL
  15.         ASCII
  16.         BREAK
  17.         CHDIR
  18.         CMD_HEAD
  19.         CMD_TAIL
  20.         C_BASE
  21.         C_EXT
  22.         C_PATH
  23.         G_BASE
  24.         G_EXT
  25.         G_PATH
  26.         ELEMENT
  27.         ELSE
  28.         EXEC
  29.         EXECUTE
  30.         EXISTS
  31.         EXIT
  32.         FGETS
  33.         FIELDS
  34.         FOR
  35.         FPRINTF
  36.         GETCH
  37.         GETPID
  38.         GETS
  39.         IDENTIFIER
  40.         IF
  41.         INT
  42.         LIST
  43.         MAKELIST
  44.         M_ECHO
  45.         NUMBER
  46.         PRINTF
  47.         PUTENV
  48.         RETURN
  49.         SIZEOFLIST
  50.         STAT
  51.         STRING
  52.         STRINGTYPE
  53.         STRLEN
  54.         STRLWR
  55.         STRUPR
  56.         SUBSTR
  57.         SYSTEM
  58.         VOID
  59.         WHILE
  60.  
  61. %right
  62.     '='
  63.     AND_IS                                  /* binary-assignment */
  64.     OR_IS
  65.     XOR_IS
  66.     SHL_IS
  67.     SHR_IS
  68.  
  69.     DIV_IS                                  /* arithmetic assignment */
  70.     MINUS_IS
  71.     MUL_IS
  72.     MOD_IS
  73.     PLUS_IS
  74.  
  75. %left OR
  76.  
  77. %left AND
  78.  
  79. %left '|'
  80.  
  81. %left '^'
  82.  
  83. %left '&'
  84.  
  85. %left EQUAL NOT_EQUAL
  86.  
  87. %left '<' '>' SMALLER_EQUAL GREATER_EQUAL OLDER YOUNGER
  88.  
  89. %left SHL SHR
  90.  
  91. %left '+' '-'
  92.  
  93. %left '*' '/' '%'
  94.  
  95. %right '!' INC DEC '~'
  96.  
  97. %expect 1
  98.  
  99.         /* Grammar Rules */
  100.  
  101. %%
  102.  
  103. input:
  104.         input
  105.         def_var_or_fun
  106.     |
  107.         def_var_or_fun
  108.     ;
  109.  
  110.                                             /* A */
  111. args:
  112.         args
  113.         comma
  114.         err_expression
  115.         {
  116.             $$ = *multargs(&$1, &$3);
  117.         }
  118.     |
  119.         err_expression
  120.         {
  121.             $$ = *firstarg(&$1);
  122.         }
  123.     ;
  124.                                             /* B */
  125. break_ok:
  126.         {
  127.             break_ok++;
  128.         }
  129.     ;
  130.  
  131. break_stat:
  132.         BREAK
  133.         {
  134.             $$ = *break_stmnt();
  135.         }
  136.     ;
  137.                                             /* C */
  138. casttype:
  139.         INT
  140.     |
  141.         LIST
  142.     |
  143.         STRINGTYPE
  144.     ;
  145.  
  146. closebrace: {parse_error = err_closebrace_expected; }   '}' ;
  147. closepar:   {parse_error = err_closepar_expected; }     ')' ;
  148. comma:      {parse_error = err_comma_expected; }        ',' ;
  149.  
  150. comma_arglist:
  151.         ','
  152.         args
  153.         {
  154.             $$ = $2;
  155.         }
  156.     |
  157.         zeroframe
  158.     ;
  159.  
  160. comma_expr:
  161.         ','
  162.         err_expression
  163.         {
  164.             $$ = $2;
  165.         }
  166.     |
  167.         zeroframe
  168.     ;
  169.  
  170. comma_or_closepar:
  171.             { parse_error = err_comma_or_closepar_expected; }   ',' ;
  172.  
  173. compound:
  174.         '{'                                 /* } (for matching) */
  175.         statements
  176.         closebrace
  177.         {
  178.             $$ = $2;
  179.         }
  180.     ;
  181.                                             /* D */
  182. def_var_or_fun:
  183.         opt_vartype
  184.         var_or_fun
  185.     |
  186.         voidtype
  187.         funcdef
  188.     ;
  189.                                             /* E */
  190.  
  191. else_tail:
  192.         ELSE
  193.         statement
  194.         {
  195.             $$ = $2;
  196.         }
  197.     |
  198.         zeroframe
  199.     ;
  200.  
  201. enterid:
  202.         IDENTIFIER
  203.         {
  204.             entervar();
  205.         }
  206.     ;
  207.  
  208. err_expression:
  209.         {
  210.             parse_error = err_in_expression;
  211.         }
  212.         expression
  213.         {
  214.             $$ = $2;
  215.         }
  216.     ;
  217.  
  218. expression:
  219.         expression
  220.         '='
  221.         expression
  222.         {
  223.             $$ = *assign(&$1, &$3);
  224.         }
  225.     |
  226.         expression
  227.         MUL_IS
  228.         expression
  229.         {
  230.             $$ = *math_ass(&$1, &$3, multiply, "*=");
  231.         }
  232.     |
  233.         expression
  234.         DIV_IS
  235.         expression
  236.         {
  237.             $$ = *math_ass(&$1, &$3, divide, "/=");
  238.         }
  239.     |
  240.         expression
  241.         MOD_IS
  242.         expression
  243.         {
  244.             $$ = *math_ass(&$1, &$3, modulo, "%=");
  245.         }
  246.     |
  247.         expression
  248.         PLUS_IS
  249.         expression
  250.         {
  251.             $$ = *math_ass(&$1, &$3, addition, "+=");
  252.         }
  253.     |
  254.         expression
  255.         MINUS_IS
  256.         expression
  257.         {
  258.             $$ = *math_ass(&$1, &$3, subtract, "-=");
  259.         }
  260.     |
  261.         expression
  262.         AND_IS
  263.         expression
  264.         {
  265.             $$ = *math_ass(&$1, &$3, band, "&=");
  266.         }
  267.     |
  268.         expression
  269.         OR_IS
  270.         expression
  271.         {
  272.             $$ = *math_ass(&$1, &$3, bor, "|=");
  273.         }
  274.     |
  275.         expression
  276.         XOR_IS
  277.         expression
  278.         {
  279.             $$ = *math_ass(&$1, &$3, xor, "^=");
  280.         }
  281.     |
  282.         expression
  283.         SHL_IS
  284.         expression
  285.         {
  286.             $$ = *math_ass(&$1, &$3, shl, "<<=");
  287.         }
  288.     |
  289.         expression
  290.         SHR_IS
  291.         expression
  292.         {
  293.             $$ = *math_ass(&$1, &$3, shr, ">>=");
  294.         }
  295.     |
  296.         expression
  297.         OR
  298.         expression
  299.         {
  300.             $$ = *or_boolean(&$1, &$3);
  301.         }
  302.     |
  303.         expression
  304.         AND
  305.         expression
  306.         {
  307.             $$ = *and_boolean(&$1, &$3);
  308.         }
  309.     |
  310.         expression
  311.         EQUAL
  312.         expression
  313.         {
  314.             $$ = *equal(&$1, &$3);
  315.         }
  316.     |
  317.         expression
  318.         NOT_EQUAL
  319.         expression
  320.         {
  321.             $$ = *unequal(&$1, &$3);
  322.         }
  323.     |
  324.         expression
  325.         '<'
  326.         expression
  327.         {
  328.             $$ = *smaller(&$1, &$3);
  329.         }
  330.     |
  331.         expression
  332.         '>'
  333.         expression
  334.         {
  335.             $$ = *greater(&$1, &$3);
  336.         }
  337.     |
  338.         expression
  339.         SMALLER_EQUAL
  340.         expression
  341.         {
  342.             $$ = *sm_equal(&$1, &$3);
  343.         }
  344.     |
  345.         expression
  346.         GREATER_EQUAL
  347.         expression
  348.         {
  349.             $$ = *gr_equal(&$1, &$3);
  350.         }
  351.     |
  352.         expression
  353.         '+'
  354.         expression
  355.         {
  356.             $$ = *addition(&$1, &$3);
  357.         }
  358.     |
  359.         expression
  360.         '&'
  361.         expression
  362.         {
  363.             $$ = *band(&$1, &$3);
  364.         }
  365.     |
  366.         expression
  367.         '|'
  368.         expression
  369.         {
  370.             $$ = *bor(&$1, &$3);
  371.         }
  372.     |
  373.         expression
  374.         '^'
  375.         expression
  376.         {
  377.             $$ = *xor(&$1, &$3);
  378.         }
  379.     |
  380.         expression
  381.         SHL
  382.         expression
  383.         {
  384.             $$ = *shl(&$1, &$3);
  385.         }
  386.     |
  387.         expression
  388.         SHR
  389.         expression
  390.         {
  391.             $$ = *shr(&$1, &$3);
  392.         }
  393.     |
  394.         expression
  395.         '-'
  396.         expression
  397.         {
  398.             $$ = *subtract(&$1, &$3);
  399.         }
  400.     |
  401.         expression
  402.         '*'
  403.         expression
  404.         {
  405.             $$ = *multiply(&$1, &$3);
  406.         }
  407.     |
  408.         expression
  409.         YOUNGER
  410.         expression
  411.         {
  412.             $$ = *young(&$1, &$3);
  413.         }
  414.     |
  415.         expression
  416.         OLDER
  417.         expression
  418.         {
  419.             $$ = *old(&$1, &$3);
  420.         }
  421.     |
  422.         expression
  423.         '/'
  424.         expression
  425.         {
  426.             $$ = *divide(&$1, &$3);
  427.         }
  428.     |
  429.         expression
  430.         '%'
  431.         expression
  432.         {
  433.             $$ = *modulo(&$1, &$3);
  434.         }
  435.     |
  436.         '-'
  437.         expression          %prec '!'
  438.         {
  439.             $$ = *negate(&$2);
  440.         }
  441.     |
  442.         INC
  443.         expression
  444.         {
  445.             $$ = *incdec(pre_op, op_inc, &$2);
  446.         }
  447.     |
  448.         expression
  449.         INC
  450.         {
  451.             $$ = *incdec(post_op, op_inc, &$1);
  452.         }
  453.     |
  454.         DEC
  455.         expression
  456.         {
  457.             $$ = *incdec(pre_op, op_dec, &$2);
  458.         }
  459.     |
  460.         expression
  461.         DEC
  462.         {
  463.             $$ = *incdec(post_op, op_dec, &$1);
  464.         }
  465.     |
  466.         '+'
  467.         expression          %prec '!'
  468.         {
  469.             $$ = $2;
  470.         }
  471.     |
  472.         '~'
  473.         expression          %prec '!'
  474.         {
  475.             $$ = *bnot(&$2);
  476.         }
  477.     |
  478.         '!'
  479.         expression
  480.         {
  481.             $$ = *not_boolean(&$2);
  482.         }
  483.     |
  484.         '('
  485.         casttype
  486.         ')'
  487.         expression         %prec '!'
  488.         {
  489.             $$ = *cast($2.type, &$4);
  490.         }
  491.     |
  492.         string
  493.         {
  494.             $$ = stackframe(e_str | e_const);
  495.         }
  496.     |
  497.         NUMBER
  498.         {
  499.             $$ = stackframe(e_int | e_const);
  500.         }
  501.     |
  502.         '('
  503.         expression
  504.         closepar
  505.         {
  506.             $$ = $2;
  507.         }
  508.     |
  509.         func_or_var
  510.     ;
  511.  
  512. expr_code:
  513.         err_expression
  514.         {
  515.             $$ = *expr_stmnt(&$1);
  516.         }
  517.     ;
  518.  
  519. expr_list:
  520.         expr_list
  521.         ','
  522.         expr_code
  523.         {
  524.             $$ = *catcode(&$1, &$3);
  525.         }
  526.     |
  527.         expr_code
  528.     ;
  529.                                             /* F */
  530. for:
  531.         FOR
  532.         nesting
  533.     ;
  534.  
  535. for_stat:
  536.         for
  537.         openpar
  538.         opt_expr_list
  539.         semicol
  540.         opt_expression
  541.         semicol
  542.         opt_expr_list
  543.         closepar
  544.         break_ok
  545.         statement
  546.         popdead
  547.         {
  548.             $$ = *for_stmnt(&$3, &$5, &$7, &$10);
  549.         }
  550.     ;
  551.  
  552. funcdef:
  553.         funid
  554.         funvars
  555.         statements
  556.         closebrace
  557.         {
  558.             close_fun(&$3);
  559.         }
  560.     ;
  561.  
  562. func_or_var:
  563.         function
  564.         closepar
  565.     |
  566.         IDENTIFIER
  567.         {
  568.             $$ = fetchvar();
  569.         }
  570.     ;
  571.  
  572. function:
  573.         zero_arg_funs                       /* getch() or gets() */
  574.         openpar
  575.         {
  576.             $$ = *zeroargs($1.type);
  577.         }
  578.     |
  579.         one_arg_funs
  580.         openpar
  581.         err_expression
  582.         {
  583.             $$ = *onearg($1.type, &$3);
  584.         }
  585.     |
  586.         two_arg_funs
  587.         openpar
  588.         err_expression
  589.         comma
  590.         err_expression
  591.         {
  592.             $$ = *twoargs($1.type, &$3, &$5);
  593.         }
  594.     |
  595.         optint_string                       /* CHDIR, SYSTEM, STAT */
  596.         openpar
  597.         err_expression                      /* int inserted if string */
  598.         comma_expr                          /* may be string if first == int */
  599.         {
  600.             $$ = *optint_string($1.type, &$3, &$4);
  601.         }
  602.     |
  603.         optint_special                      /* EXEC, EXECUTE */
  604.         openpar                             /* alternatives: */
  605.         err_expression                      /* fun(int, string, ...) */
  606.         comma_arglist                       /* fun(string, ...)       */
  607.         {
  608.             $$ = *optint_special($1.type, &$3, &$4);
  609.         }
  610.     |
  611.         PRINTF
  612.         openpar
  613.         args                                /* first may be anything */
  614.         {
  615.             $$ = *specials(f_printf, &$3);
  616.         }
  617.     |
  618.         FPRINTF
  619.         openpar
  620.         args                                /* argcount >= 2 required */
  621.         {
  622.             $$ = *exec_fprintf($1.type, &$3);
  623.         }
  624.     |
  625.         funname
  626.         openpar
  627.         opt_arglist
  628.         {
  629.             $$ = *callfun($1.evalue, &$3);
  630.         }
  631.     |
  632.         makelist
  633.     |
  634.         strupr_lwr
  635.         openpar
  636.         err_expression
  637.         {
  638.             $$ = *strupr_lwr($1.type, &$3);  /* string conversion */
  639.         }
  640.     ;
  641.  
  642. funid:
  643.         IDENTIFIER
  644.         {
  645.             open_fun();
  646.         }
  647.     ;
  648.  
  649. funname:
  650.         IDENTIFIER
  651.         {
  652.             $$.evalue = fetchfun();
  653.         }
  654.     ;
  655.  
  656. funvars:
  657.         openpar
  658.         opt_parlist
  659.         ')'
  660.         openbrace
  661.         opt_locals
  662.         {
  663.             make_frame();
  664.         }
  665.     ;
  666.  
  667.                                             /* G */
  668.                                             /* H */
  669.                                             /* I */
  670. if:
  671.         IF
  672.         nesting
  673.     ;
  674.  
  675. if_stat:
  676.         if
  677.         openpar
  678.         err_expression
  679.         closepar
  680.         statement
  681.         popdead
  682.         pushdead
  683.         else_tail
  684.         popdead
  685.         {
  686.             $$ = *if_stmnt(&$3, &$5, &$8);
  687.         }
  688.     ;
  689.                                             /* J */
  690.                                             /* K */
  691.                                             /* L */
  692. leave_key:
  693.         RETURN
  694.     |
  695.         EXIT
  696.     ;
  697.  
  698. local_list:
  699.         type_of_var
  700.         vardefs
  701.     ;
  702.  
  703. locals:
  704.         locals
  705.         local_list
  706.     |
  707.         local_list
  708.     ;
  709.                                             /* M */
  710. makelist:
  711.                                              /* makelist(expr) */
  712.         makelist_expr
  713.         makelist_normal                     /* returns O_FILE expression */
  714.         {
  715.             $$ = *makelist
  716.                  (
  717.                      multargs
  718.                      (
  719.                          firstarg(&$2),     /* O_FILE is passed */
  720.                          &$1                /* expression is passed */
  721.                      ),
  722.                      op_hlt                 /* not op_younger or op_older */
  723.                  );
  724.         }
  725.     |
  726.                                             /* makelist(expr, expr) */
  727.         makelist_expr
  728.         comma
  729.         err_expression
  730.         {
  731.             $$ = *makelist
  732.                  (
  733.                      multargs
  734.                      (
  735.                          firstarg(&$1),     /* fileattribute is passed */
  736.                          &$3                /* expression is passed */
  737.                      ),
  738.                      op_hlt                 /* not op_younger or op_older */
  739.                  );
  740.         }
  741.     |
  742.         makelist_expr                       /* makelist(expr, older, expr) */
  743.         comma
  744.         older_younger
  745.         comma
  746.         err_expression
  747.         makelist_normal
  748.         {
  749.             $$ = *makelist
  750.                  (
  751.                     multargs
  752.                     (
  753.                         multargs
  754.                         (
  755.                             firstarg(&$6),  /* O_FILE   is passed */
  756.                             &$1             /* 1st expression is passed */
  757.                         ),
  758.                         &$5                 /* 2nd expression is passed */
  759.                      ),
  760.                      $3.type                /* older/younger */
  761.                  );
  762.         }
  763.     |
  764.         makelist_expr                 /* makelist(expr, expr, older, expr) */
  765.         comma
  766.         err_expression
  767.         comma
  768.         older_younger
  769.         comma
  770.         err_expression
  771.         {
  772.             $$ = *makelist
  773.                  (
  774.                     multargs
  775.                     (
  776.                         multargs
  777.                         (
  778.                             firstarg(&$1),  /* attribute is passed */
  779.                             &$3             /* 2nd expression is passed */
  780.                         ),
  781.                         &$7                 /* 3rd expression is passed */
  782.                      ),
  783.                      $5.type                /* older/younger */
  784.                  );
  785.         }
  786.     ;
  787.  
  788. makelist_expr:
  789.         MAKELIST
  790.         openpar
  791.         err_expression
  792.         {
  793.             $$ = $3;
  794.         }
  795.     ;
  796.  
  797. makelist_normal:
  798.         {
  799.             $$ = stackframe(e_int | e_const);
  800.             $$.evalue = O_FILE;
  801.         }
  802.     ;
  803.                                              /* N */
  804. nesting:
  805.         pushdead
  806.         {
  807.             nestlevel++;
  808.         }
  809.     ;
  810.                                             /* O */
  811. ok:
  812.     ';'
  813.         {
  814.             yyerrok;
  815.         }
  816.     ;
  817.  
  818. older_younger:
  819.         {parse_error = err_older_younger; }
  820.         old_young
  821.         {
  822.             $$ = $2;
  823.         }
  824.     ;
  825.  
  826. old_young:
  827.         OLDER
  828.     |
  829.         YOUNGER
  830.     ;
  831.  
  832. one_arg_funs:
  833.         ASCII
  834.     |
  835.         SIZEOFLIST
  836.     |
  837.         EXISTS
  838.     |
  839.         M_ECHO
  840.     |
  841.         CMD_TAIL
  842.     |
  843.         CMD_HEAD
  844.     |
  845.         ARG_HEAD
  846.     |
  847.         ARG_TAIL
  848.     |
  849.         G_BASE
  850.     |
  851.         G_PATH
  852.     |
  853.         G_EXT
  854.     |
  855.         PUTENV
  856.     |
  857.         STRLEN
  858.     ;
  859.  
  860. openpar:    {parse_error = err_openpar_expected; }      '(' ;
  861. openbrace:  {parse_error = err_openbrace_expected; }    '{' ;
  862.                                             /* } for matching */
  863. opt_arglist:
  864.         args
  865.     |
  866.         zeroframe
  867.     ;
  868.  
  869. opt_expression:
  870.         err_expression
  871.     |
  872.         {
  873.             $$ = stackframe(e_int | e_const);
  874.             $$.evalue = 1;
  875.         }
  876.     ;
  877.  
  878. opt_expr_list:
  879.         expr_list
  880.     |
  881.         zeroframe
  882.     ;
  883.  
  884. optint_special:
  885.         EXEC                                /* optional int allowed */
  886.     |
  887.         EXECUTE
  888.     ;
  889.  
  890. optint_string:
  891.         STAT
  892.     |
  893.         CHDIR
  894.     |
  895.         SYSTEM
  896.     ;
  897.  
  898. opt_locals:
  899.         locals
  900.     |
  901.     ;
  902.  
  903. opt_parlist:
  904.         pars
  905.     |
  906.     ;
  907.  
  908. opt_vartype:
  909.         type_of_var
  910.     |
  911.         {
  912.             vartype = e_int;
  913.         }
  914.     ;
  915.                                             /* P */
  916. pars:
  917.         pars
  918.         comma
  919.         partype
  920.     |
  921.         partype
  922.     ;
  923.  
  924. partype:
  925.         type_of_var
  926.         enterid
  927.         {
  928.             n_params++;
  929.         }
  930.     ;
  931.  
  932. popdead:
  933.         {
  934.             pop_dead();
  935.         }
  936.     ;
  937.  
  938. pushdead:
  939.         {
  940.             push_dead();                    /* set new dead-level */
  941.         }
  942.     ;
  943.  
  944.                                             /* Q */
  945.                                             /* R */
  946. return_stat:
  947.         leave_key
  948.         return_tail
  949.         {
  950.             $$ = *return_stmnt($1.type, &$2);
  951.         }
  952.     ;
  953.  
  954. return_tail:
  955.         err_expression
  956.     |
  957.         zeroframe
  958.     ;
  959.                                             /* S */
  960. semicol:    {parse_error = err_semicol_expected; }      ';' ;
  961.  
  962. statement:
  963.         stm
  964.         {
  965.             sem_err = 0;
  966.         }
  967.     ;
  968.  
  969. statements:
  970.         statements
  971.         statement
  972.         {
  973.             $$ = *cat_stmnt(&$1, &$2);
  974.         }
  975.     |
  976.         zeroframe
  977.     ;
  978.  
  979. stm:
  980.         compound
  981.     |
  982.         ';'
  983.         zeroframe
  984.         {
  985.             $$ = $1;
  986.         }
  987.     |
  988.         expr_code
  989.         semicol
  990.     |
  991.         while_stat
  992.     |
  993.         if_stat
  994.     |
  995.         for_stat
  996.     |
  997.         return_stat
  998.         semicol
  999.     |
  1000.         break_stat
  1001.         semicol
  1002.     |
  1003.         error
  1004.         ok
  1005.     ;
  1006.  
  1007. string:
  1008.     string
  1009.     STRING
  1010.     {
  1011.         stringbuf = xstrcat(stringbuf, string);/* catenate the new string */
  1012.     }
  1013. |
  1014.     STRING
  1015.     {
  1016.         free(stringbuf);                    /* free former string */
  1017.         stringbuf = xstrdup(string);        /* duplicate initial string */
  1018.     }
  1019. ;
  1020.  
  1021. strupr_lwr:
  1022.         STRUPR
  1023.     |
  1024.         STRLWR
  1025.     ;
  1026.  
  1027.                                         /* T */
  1028. two_arg_funs:
  1029.         C_EXT                               /* string, string */
  1030.     |
  1031.         C_BASE
  1032.     |
  1033.         C_PATH
  1034.     |
  1035.         ELEMENT                             /* int, list | int, string */
  1036.     |
  1037.         FGETS                               /* list fgets(string, int) */
  1038.     |
  1039.         FIELDS                              /* string, string */
  1040.     |
  1041.         SUBSTR                              /* string, string */
  1042.     ;
  1043.  
  1044. type_of_var:
  1045.         vartype
  1046.         {
  1047.             parse_error = err_identifier_expected;
  1048.             vartype = $1.type;
  1049.         }
  1050.     ;
  1051.                                             /* U */
  1052.                                             /* V */
  1053. vardefs:
  1054.         varnames
  1055.         semicol
  1056.     ;
  1057.  
  1058. varnames:
  1059.         varnames
  1060.         comma
  1061.         enterid
  1062.     |
  1063.         enterid
  1064.     |
  1065.         error
  1066.         ok
  1067.     ;
  1068.  
  1069. var_or_fun:
  1070.         vardefs
  1071.     |
  1072.         funcdef
  1073.     ;
  1074.  
  1075. vartype:
  1076.         INT
  1077.     |
  1078.         STRINGTYPE
  1079.     |
  1080.         LIST
  1081.     ;
  1082.  
  1083. voidtype:
  1084.         VOID
  1085.         {
  1086.             vartype = 0;
  1087.         }
  1088.     ;
  1089.                                             /* W */
  1090. while:
  1091.         WHILE
  1092.         nesting
  1093.     ;
  1094.  
  1095. while_stat:
  1096.         while
  1097.         openpar
  1098.         err_expression
  1099.         closepar
  1100.         break_ok
  1101.         statement
  1102.         popdead
  1103.         {
  1104.             $$ = *while_stmnt(&$3, &$6);
  1105.         }
  1106.     ;
  1107.  
  1108.                                             /* X */
  1109.                                             /* Y */
  1110.                                             /* Z */
  1111. zero_arg_funs:
  1112.         GETCH
  1113.     |
  1114.         GETPID
  1115.     |
  1116.         GETS
  1117.     ;
  1118.  
  1119. zeroframe:
  1120.         {
  1121.             $$ = stackframe(0);
  1122.         }
  1123.     ;
  1124. %%
  1125.  
  1126. int yywrap()
  1127. {
  1128.     return (1);
  1129. }
  1130.